/*
 * @Description: 用户信息
 * @Author: DHL
 * @Date: 2022-04-02 14:02:17
 * @LastEditors: DHL
 * @LastEditTime: 2023-12-14 10:16:28
 */

import { defineComponent, computed, onMounted, reactive, ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { assign, cloneDeep } from 'lodash-es'
import { TwTableOptions } from '@/types/table.d'
import { arraySerializeToStr } from '@/utils/arrayUtils'
import usePermission from '@/hooks/web/permission'
import { UserModel, UserPageParams } from '@/api/system/model/userModel'
import { apiUserLogicBatchDeleteByIds, apiUserSearch, apiUserUpdateById } from '@/api/system/user'
import { stringUtils } from '@/utils/stringUtils'
import type Node from 'element-plus/es/components/tree/src/model/node'

import userForm from './form.vue'
import organizationTree from '../../components/organizationTree.vue'
import userResetPwd from '@/pages/password/resetPwd.vue'
import userOrgGrant from './orgGrant.vue'
import { Splitpanes, Pane } from 'splitpanes'
import 'splitpanes/dist/splitpanes.css'

export default defineComponent({
  name: 'User',
  components: { userForm, organizationTree, userResetPwd, userOrgGrant, Splitpanes, Pane },
  setup(props) {
    //////////////////////////////////////////////////
    // 属性
    //////////////////////////////////////////////////

    const loading = ref(false)
    const loadingByDel = ref(false)

    // 权限控制
    const { hasPermission } = usePermission()

    /**
     * 表格数据
     */
    const tableData = ref()

    /**
     * 查询表单
     */
    const searchFormRef = ref()

    /**
     * 数据列表
     */
    const tableRef = ref()

    /**
     * 表单
     */
    const formRef = ref()

    /**
     * 是否有选中的行
     */
    const isSelectRows = computed(() => {
      let selectRows: Array<UserModel> = []
      if (tableRef.value) {
        selectRows = tableRef.value.getSelectRows()
      }
      return selectRows.length < 1
    })

    //////////////////////////////////////////////////
    // 查询表单
    //////////////////////////////////////////////////

    const defaultSearchForm = {
      loginName: '', // 登陆名称
      pwd: '', // 登录密码
      name: '', // 姓名
      userType: '', // 用户类型
      phone: '', // 手机号码
      mail: '', // 邮箱
      status: '1', // 用户状态（0，失效；1，生效）
      openid: '', // 微信OPENID
      photo: '', // 头像
      clientId: '', // APP客户端唯一标识
      position: '', // 职务
      isAllChildNode: true
    }

    /**
     * 查询表单
     */
    const searchForm = reactive(cloneDeep(defaultSearchForm))

    //////////////////////////////////////////////////
    // 表格
    //////////////////////////////////////////////////

    /**
     * 表格配置
     */
    const tableOptions = reactive<TwTableOptions>({
      id: 'userTable',
      sortConfig: {
        defaultSort: [
          { field: 'userType', order: 'asc' },
          { field: 'loginName', order: 'asc' }
        ]
      },
      columns: [
        { type: 'checkbox', fixed: 'left', title: '', align: 'center', width: 40 },
        { type: 'seq', fixed: 'left', title: '序号', width: 50 },
        { field: 'loginName', title: '登陆名称', sortable: true },
        { field: 'name', title: '姓名', sortable: true },
        { field: 'userType', title: '用户类型', sortable: true, params: { dict: 'USERTYPE' } },
        { field: 'position', title: '职务', sortable: true },
        { field: 'orgName', title: '机构', sortable: false },
        { field: 'phone', title: '手机号码', sortable: false },
        {
          field: 'status',
          title: '用户状态',
          sortable: true,
          params: { dict: 'USER_STATUS' },
          slots: { default: 'userStatus' }
        },
        { field: 'updater', title: '更新人', sortable: true },
        { field: 'updateDate', title: '更新时间', sortable: true },
        { title: '操作', fixed: 'right', width: 240, slots: { default: 'action' } }
      ]
    })

    /**
     * 绑定事件
     */
    const tableEvents = reactive({
      cellDblclick(params: { row: UserModel }) {
        if (hasPermission('USER-GETBYID')) {
          handleOpenForm('view', params.row)
        } else {
          ElMessage.warning('无权限访问')
        }
      }
    })

    //////////////////////////////////////////////////
    // 函数
    //////////////////////////////////////////////////

    /**
     * 查询表格数据函数
     * @param queryParams
     */
    function searchList(queryParams: UserPageParams) {
      loading.value = true
      apiUserSearch(
        assign(queryParams, searchForm, {
          orgId: selectOrg.id
        })
      )
        .then((result) => {
          tableData.value = result
        })
        .catch(() => {})
        .finally(() => {
          loading.value = false
        })
    }

    /**
     * 查询表格数据
     */
    function handleSearch() {
      tableRef.value.handleQuery()
    }

    /**
     * 刷新
     */
    function handleRefresh() {
      tableRef.value.handleReload()
    }

    /**
     * 重置
     */
    function handleReset() {
      assign(searchForm, cloneDeep(defaultSearchForm))
      tableRef.value.handleQuery()
    }

    /**
     * 批量删除
     */
    function handleDelete(row?: UserModel) {
      let selectRows: Array<UserModel> = []

      if (row) {
        selectRows = [row]
      } else {
        selectRows = tableRef.value.getSelectRows()
      }

      if (selectRows.length === 0) {
        ElMessage.warning('请选择需要删除的数据')
        return
      }

      ElMessageBox.confirm(`此操作将删除${selectRows.length}条记录, 是否继续?`, '删除提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          loadingByDel.value = true
          const ids = arraySerializeToStr(selectRows, 'id')
          apiUserLogicBatchDeleteByIds(ids)
            .then((result) => {
              if (result?.success) {
                handleRefresh()
                ElMessage.success(result.message)
              } else {
                ElMessage.error(result?.message)
              }
            })
            .catch(() => {})
            .finally(() => {
              loadingByDel.value = false
            })
        })
        .catch(() => {
          ElMessage.info('删除被取消了')
        })
    }

    /**
     * 弹出表单
     */
    function handleOpenForm(action: string, row?: UserModel) {
      if (action === 'add' && stringUtils.isEmpty(selectOrg.id)) {
        ElMessage.warning('请选择机构')
        return
      }

      formRef.value.handleOpen(action, row, {
        orgId: selectOrg.id,
        orgName: orgTreeRef.value.getSelectNodeParentName().join(' - ')
      })
    }

    /**
     * 根据主键更新
     */
    function handleUpdateById(row: UserModel) {
      loading.value = true

      const submitParams: UserModel = {
        id: row.id,
        status: row.status
      } as UserModel

      apiUserUpdateById(submitParams)
        .then((result) => {
          if (result?.success) {
            ElMessage.success(result.message)
          } else {
            ElMessage.error(result?.message)
          }
        })
        .catch(() => {})
        .finally(() => {
          loading.value = false
        })
    }

    //////////////////////////////////////////////////
    // 机构树
    //////////////////////////////////////////////////
    const orgTreeRef = ref()

    /**
     * 选中的组织机构
     */
    let selectOrg: any = {}

    /**
     * 节点点击事件
     */
    function handleNodeClick(treeNode?: Node) {
      selectOrg = treeNode ? treeNode : {}
      handleRefresh()
    }

    //////////////////////////////////////////////////
    // 重置密码
    //////////////////////////////////////////////////
    const userResetPwdRef = ref()

    /**
     * 重置用户密码
     */
    function handleShowResetPwdForm(row: UserModel) {
      userResetPwdRef.value.handleOpen(row.id)
    }

    //////////////////////////////////////////////////
    // 授权机构
    //////////////////////////////////////////////////
    const userOrgGrantRef = ref()
    /**
     * 机构授权
     */
    function handleOrgGrant(row: UserModel) {
      userOrgGrantRef.value.handleOpen(row)
    }

    //////////////////////////////////////////////////
    // 生命周期
    //////////////////////////////////////////////////
    onMounted(() => {})

    return {
      loading,
      loadingByDel,
      tableData,
      searchFormRef,
      tableRef,
      formRef,
      searchForm,
      tableOptions,
      tableEvents,
      isSelectRows,
      searchList,
      handleSearch,
      handleRefresh,
      handleReset,
      handleDelete,
      handleOpenForm,
      orgTreeRef,
      handleNodeClick,
      userResetPwdRef,
      handleShowResetPwdForm,
      userOrgGrantRef,
      handleOrgGrant,
      handleUpdateById
    }
  }
})
